package jp.co.nes.awssupport.business.utility;

import java.io.IOException;
import java.io.InputStream;

import com.amazonaws.services.s3.model.S3Object;

import jp.co.nes.awssupport.business.bean.ManifestBean;
import jp.co.nes.awssupport.common.base.CommonException;
import jp.co.nes.awssupport.common.utility.AwsS3Helper;
import jp.co.nes.awssupport.common.utility.JsonUtil;

/**
 * 請求CSVマニュフェストヘルパーです。
 */
public class ManifestHelper {

    /** バケット名 */
    private String bucketName;

    /** オブジェクトキー */
    private String objectKey;

    /** アクセスキー */
    private String accessKey;

    /** シークレットキー */
    private String secretKey;

    /** 請求CSVマニュフェスト */
    private ManifestBean manifestBean;

    /**
     * バケット名、オブジェクトキーを引数にもつコンストラクタです。
     *
     * @param bucketName バケット名
     * @param objectKey オブジェクトキー
     */
    public ManifestHelper(String bucketName, String objectKey) {
        this(bucketName, objectKey, null, null);
    }

    /**
     * バケット名、オブジェクトキー、アクセスキー、シークレットキーを引数にもつコンストラクタです。
     *
     * @param bucketName バケット名
     * @param objectKey オブジェクトキー
     * @param accessKey アクセスキー
     * @param secretKey シークレットキー
     */
    public ManifestHelper(String bucketName, String objectKey, String accessKey, String secretKey) {
        this.bucketName = bucketName;
        this.objectKey = objectKey;
        this.accessKey = accessKey;
        this.secretKey = secretKey;
        manifestBean = createManifestBean();
    }

    /**
     * 請求CSVマニュフェストを返却します。
     *
     * @return 請求CSVマニュフェスト
     */
    public ManifestBean getManifestBean() {
        return manifestBean;
    }

    /**
     * 請求CSVマニュフェストを生成します。
     *
     * @return 請求CSVマニュフェスト
     */
    protected ManifestBean createManifestBean() {
        ManifestBean resultBean = null;
        try (InputStream inputStream = getManifestInputStream()) {
            if (inputStream == null) {
                StringBuilder builder = new StringBuilder();
                builder.append("S3ObjectInputStream is null(bucketName=");
                builder.append(bucketName);
                builder.append(",objectKey=");
                builder.append(objectKey);
                builder.append(")");
                throw new CommonException(builder.toString());
            }
            resultBean = JsonUtil.convertJsonInputStreamToBean(inputStream, ManifestBean.class);
        } catch (IOException e) {
            throw new CommonException(e);
        }
        return resultBean;
    }

    /**
     * 請求CSVマニュフェストの入力ストリームを返却します。
     *
     * @return 請求CSVマニュフェストの入力ストリーム
     */
    protected InputStream getManifestInputStream() {
        AwsS3Helper helper = null;
        if (accessKey == null) {
            helper = new AwsS3Helper();
        } else {
            helper = new AwsS3Helper(accessKey, secretKey);
        }
        S3Object s3Object = helper.getObject(bucketName, objectKey);
        return s3Object.getObjectContent();
    }
}
